package cn.edu.zufe.mjt.dfs;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

/**
 *  深度有限搜索——完整二叉树
 *  塔子哥有一棵节点数为 n 的完整二叉树，对于一个完整二叉树的定义是:要么每个节点有两个子节点,要么每个节点没有子节点。
 * 权值计算规则:
 * 没有子节点的节点，其权值为 1。
 * 有两个子节点的节点，其权值为两个儿子节点的权值的运算结果。
 * 每个节点有两种运算，要么为加法，要么为乘法。如下给出一个长度为n的数组c:ci=0 :节点 i的运算是 加法ci=1 :节点 i 的运算是 乘法
 * 现在，塔子哥问你这个完整二叉树的根节点的权值是多少。
 * 输入描述
 * 第一行，一个正整数 n(1 ≤ n ≤ 10^5)，表示完整二叉树中的节点个数。
 * 第二行，n-1个正整数 p[2,3,…,n]，其中 p[i](1< p[i]< n)表示第i个节点的父节点，1号节点是根节点。
 * 第三行，n个整数 c[1,2.…,n]，含义如题面描述所示。
 * 数据保证形成满足题目描述的二叉完整树。
 * 输出描述
 * -个整数，表示根节点的值，答案对 10^9+7取模。
 */
public class CompleteBinaryTree {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[] p = new int[n];
        for (int i = 1; i < n; i++) {
            p[i] = sc.nextInt();
        }
        int[] c = new int[n];
        for (int i = 0; i < n; i++) {
            c[i] = sc.nextInt();
        }
        int rootValue = rootValue(p, c, 0);
        System.out.println(rootValue);

    }


    public static int rootValue(int[] node, int[] weights, int root) {
        // 构造邻接表
        List<List<Integer>> tree = new ArrayList<>();
        for (int i = 0; i < node.length; i++) {
            tree.add(new ArrayList<>());
        }
        for (int i = 1; i < node.length; i++) {
            tree.get(node[i] - 1).add(i);
        }

        return dfs(tree, weights, root);
    }

    private static int dfs(List<List<Integer>> tree, int[] weights, int currentNode) {
        if (tree.get(currentNode).size() == 0) {
            return 1;
        }
        int left = dfs(tree, weights, tree.get(currentNode).get(0));  // 递归计算左子树权值
        int right = dfs(tree, weights, tree.get(currentNode).get(1));  // 递归计算右子树权值
        if (weights[currentNode] == 0) {  // 根据权值数组先择算术运算
            return (left + right) % 1000000007;
        } else {
            return (left * right) % 1000000007;
        }
    }
}
